freeslot(
	"MT_SMOKEGLIDERSPAWN",
	"S_SMOKEGLIDERSPAWN",

	"MT_SMOKEGLIDER",
	--"S_SMOKEGLIDER_INIT",
	"S_SMOKEGLIDER_GLIDE",

	"SPR_GLID")

mobjinfo[MT_SMOKEGLIDERSPAWN] = {
	doomednum = 528,
	spawnstate = S_SMOKEGLIDERSPAWN,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	flags = MF_NOGRAVITY|MF_SPECIAL
}

states[S_SMOKEGLIDERSPAWN] = {SPR_GLID,0}

addHook("TouchSpecial", function(special, toucher)
	if not toucher.player then return true end
	--ORIGINALLY-- if (toucher.player.pflags & PF_ITEMHANG) then return true end
	--[[NOW]] if toucher.player.powers[pw_carry] then return true end

	local glider = P_SpawnMobj(special.x, special.y, special.z, MT_SMOKEGLIDER)
	glider.angle = special.angle
	glider.target = toucher
	toucher.tracer = glider
	--ORIGINALLY-- toucher.player.pflags = $1|PF_ITEMHANG
	--[[NOW]] toucher.player.powers[pw_carry] = CR_GENERIC
	toucher.angle = special.angle
	glider.momx = toucher.momx
	glider.momy = toucher.momy
	glider.momz = toucher.momz
	toucher.player.pflags = $1&~PF_JUMPED

	return true
end, MT_SMOKEGLIDERSPAWN)

mobjinfo[MT_SMOKEGLIDER] = {
	spawnhealth = 1,
	spawnstate = S_SMOKEGLIDER_GLIDE,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	flags = MF_RUNSPAWNFUNC|MF_SPECIAL|MF_SLIDEME
}

-- A_SmokeGlider, var1 = maximum falling speed
function A_SmokeGlider(mo, var1)
	--print("test")
	mo.momz = $1+FixedMul(mo.scale*P_MobjFlip(mo)/4, min(FRACUNIT, P_AproxDistance(mo.momx, mo.momy)/15))
	--ORIGINALLY-- if mo.momz < -FixedDiv(var1, P_AproxDistance(mo.momx, mo.momy)) then
	--[[NOW]] if mo.momz < -FixedDiv(var1, P_AproxDistance(mo.momx, mo.momy) or 1) then
	--[[CHANGE: preventing Lua divide-by-zero error from original script]]
		mo.momz = $1+(mo.scale*P_MobjFlip(mo))
	end

	-- Find a wind sector tagged with 8000, and blow up if found (currently does not support wind in FOFs)
	if (mo.subsector.sector.special & (15<<8)) == 512 then
		local line = P_FindSpecialLineFromTag(8000, mo.subsector.sector.tag, -1)
		if line ~= -1 then
			line = lines[line]
			local dist = P_AproxDistance(line.dx, line.dy)
			if (mo.momz < dist/8) then
				mo.momz = min($1+(dist/192), dist/8)
			end
		end
	end

	if mo.target and mo.target.valid and mo.target.player then
		-- Get player input and shift momentum accordingly (analog is unsupported kthxbye)
		mo.angle = mo.target.angle

		local forward, side
		local cmd = mo.target.player.cmd
		local factor = 600
		forward = (cmd.forwardmove+3)*factor
		side = cmd.sidemove*factor
		P_Thrust(mo, mo.angle, forward)
		P_Thrust(mo, mo.angle-ANGLE_90, side)

		if P_AproxDistance(mo.momx, mo.momy) > mo.target.player.normalspeed then
			mo.momx = 9*$1/10
			mo.momy = 9*$1/10
		end

		if cmd.buttons & BT_USE then
				mo.target.momz = $1+mo.momz
			--ORIGINALLY-- mo.target.player.pflags = ($1&~PF_ITEMHANG)|PF_JUMPED
			--[[NOW]] mo.target.player.pflags = $|PF_JUMPED
			--[[NOW]] mo.target.player.powers[pw_carry] = 0
		end

		--ORIGINALLY-- if not (mo.target.player.pflags & PF_ITEMHANG) then
		--[[NOW]] if mo.target.player.powers[pw_carry] ~= CR_GENERIC then
			mo.target = nil
		end
	end

	-- Rotate momentum toward facing direction
	if mo.momx or mo.momy then
		local dist, angle, target
		dist = R_PointToDist2(0, 0, mo.momx, mo.momy)
		angle = R_PointToAngle2(0, 0, mo.momx, mo.momy)

		target = mo.angle-angle
		target = $1/40

		P_InstaThrust(mo, angle+target, dist)
	end

	if mo.z <= mo.floorz then
		if mo.target and mo.target.player then
			--ORIGINALLY-- mo.target.player.pflags = ($1&~PF_ITEMHANG)
			--[[NOW]] mo.target.player.powers[pw_carry] = 0
			if mo.target.z < mo.target.floorz then
				mo.target.z = mo.target.floorz
			end
		end
		P_KillMobj(mo)
		return
	end
end

-- Look for new players if nobody's riding already
addHook("TouchSpecial", function(glider, toucher)
	if glider.target and glider.target.valid then return true end
	if toucher.momz > 0 then return true end
	if toucher.player.cmd.buttons & BT_USE then return true end
	--ORIGINALLY-- if (toucher.player.pflags & PF_ITEMHANG) then return true end
	--[[NOW]] if toucher.player.powers[pw_carry] then return true end

	glider.target = toucher
	toucher.tracer = glider
	--ORIGINALLY-- toucher.player.pflags = $1|PF_ITEMHANG
	--[[NOW]] toucher.player.powers[pw_carry] = CR_GENERIC
	toucher.angle = glider.angle
	glider.momx = toucher.momx
	glider.momy = toucher.momy
	glider.momz = toucher.momz
	toucher.player.pflags = $1&~PF_JUMPED

	return true
end, MT_SMOKEGLIDER)

states[S_SMOKEGLIDER_GLIDE] = {SPR_GLID, 0, 1, A_SmokeGlider, 48*FRACUNIT, 0, S_SMOKEGLIDER_GLIDE}